﻿using BBCore.Core.Models.Admins;
using BBCore.Infrastructure.Helps;
using BBCore.Server.Custom_Validators;
using BBCore.Server.Data;
using BootstrapBlazor.Components;
using DocumentFormat.OpenXml.Spreadsheet;
using Microsoft.AspNetCore.Components;
using System.Diagnostics.CodeAnalysis;

namespace BBCore.Server.Components.Pages.Admins
{
    public partial class UserPageManager
    {
        private EasyAdminTable<UserEntity>? _adminTable;
        private List<IValidator> UserRules { get; } = new List<IValidator>();//用户名自定义验证
        protected override void OnInitialized()
        {
            base.OnInitializedAsync();
            UserRules.Add(new UserNameValidator(IAdminService));
        }

        [Inject]
        [NotNull]
        private ToastService? Toast { get; set; }
        [Inject]
        [NotNull]
        private ITableExport? TableExport { get; set; }
        
        [NotNull]
        private List<UserEntity>? Items { get; set; }
        /// <summary>
        /// 导出当前页数据
        /// </summary>
        /// <param name="context"></param>
        /// <returns></returns>
        private async Task ExcelExportAsync(ITableExportContext<UserEntity> context)
        {
            // 自定义导出模板导出当前页面数据为 Excel 方法
            // 使用 BootstrapBlazor 内置服务 ITableExcelExport 实例方法 ExportAsync 进行导出操作
            // 导出数据使用 context 传递来的 Rows/Columns 即为当前页数据
            var ret = await TableExport.ExportExcelAsync(context.Rows, context.Columns, $"User_{DateTime.Now:yyyyMMddHHmmss}.xlsx");

            // 返回 true 时自动弹出提示框
            await ShowToast(ret);
        }
        /// <summary>
        /// 导出全部数据
        /// </summary>
        /// <param name="context"></param>
        /// <returns></returns>
        private async Task ExcelExportAllAsync(ITableExportContext<UserEntity> context)
        {
            // 自定义导出模板导出当前页面数据为 Excel 方法
            // 使用 BootstrapBlazor 内置服务 ITableExport 实例方法 ExportExcelAsync 进行导出操作
            // 通过 context 参数的查询条件
            var option = context.BuildQueryPageOptions();

            // 通过内置扩展方法 GetFilterFunc 过滤数据
            // EFCore 可使用 GetFilterLambda 获得表达式直接给 Where 方法使用
            Items = UserEntity.Select.ToList();
            var data = Items.Where(option.ToFilterFunc<UserEntity>());
            
            // 导出符合条件的所有数据 data
            var ret = await TableExport.ExportExcelAsync(data, context.Columns, $"User_{DateTime.Now:yyyyMMddHHmmss}.xlsx");

            // 返回 true 时自动弹出提示框
            await ShowToast(ret);
        }
        private async Task ShowToast(bool result)
        {
            if (result)
            {
                await Toast.Success("数据导出", "导出数据成功，4 秒后自动关闭");
            }
            else
            {
                await Toast.Error("数据导出", "导出数据失败，4 秒后自动关闭");
            }
        }

        private async Task<bool> OnSaveAsync(UserEntity arg1, ItemChangedType arg2)
        {
            if (arg2 == ItemChangedType.Add)
            {
                arg1.Password = MD5Encryption.Encrypt(arg1.UserName!);
            }
            var ret = await IDataService.SaveAsync(arg1, arg2);
            if (ret && arg2 == ItemChangedType.Add)
            {
                await SwalService.Show(new SwalOption()
                {
                    Category = SwalCategory.Success,
                    Title = "添加用户成功",
                    Content = $"您的密码是{arg1.UserName}"
                });
            }

            return ret;
        }
        /// <summary>
        /// 重置密码
        /// </summary>
        /// <param name="user"></param>
        /// <returns></returns>
        private async Task ResetPassword(UserEntity user)
        {
            user.Password =MD5Encryption.Encrypt(user.UserName!);
            await user.SaveAsync();
            await SwalService.Show(new SwalOption()
            {
                Category = SwalCategory.Success,
                Title = "重置密码成功",
                Content = $"您的密码是{user.UserName}"
            });
        }


    }
}
